#ifndef IO__CAMERA_HPP
#define IO__CAMERA_HPP

#include <chrono>
#include <memory>
#include <string>
#include "rclcpp/rclcpp.hpp"
#include "sensor_msgs/msg/image.hpp"
namespace io
{
    // 相机参数结构体
  typedef struct
  {
    // 相机基本信息
    std::string camera_name; // 相机名称

    // 相机控制参数
    double exposure_ms;  // 曝光时间（毫秒）
    double gamma;        // 伽马值（MindVision特有）
    double gain;         // 曝光增益（hikrobot特有）
    std::string vid_pid; // 设备VID/PID

  } CameraParams;
  
  class CameraBase
  {
  public:
    explicit CameraBase(const rclcpp::Logger &logger) : logger_(logger) {}
    virtual ~CameraBase() = default;
    virtual void read(sensor_msgs::msg::Image &img) = 0;

    /**
     * @brief 统一参数设置接口（子类需实现）
     * @param param_name 参数名（如 "exposure_ms"、"gamma"、"gain"）
     * @param value 参数值（统一用 double 传递，子类内部转换类型）
     * @return true：参数支持且设置成功；false：参数不支持或设置失败
     */
    virtual bool set_param(const std::string &param_name, double value) = 0;

    /**
     * @brief 统一用于关闭相机（子类需实现）
     */
    virtual void close() = 0;
    
    /**
     * @brief 统一用于打开相机（子类需实现）
     */
    virtual bool open() = 0;

  protected:
    rclcpp::Logger logger_;
  };

  class Camera
  {
  public:
    Camera(const io::CameraParams &camera_param, const rclcpp::Logger &logger);
    void read(sensor_msgs::msg::Image &img);
    void close();
    bool open();
    bool set_param(const std::string &param_name, double value);
  private:
    // 多态指针
    std::unique_ptr<CameraBase> camera_;
    rclcpp::Logger logger_;
  };

}

#endif // IO__CAMERA_HPP